package com._函数接口;

import java.util.HashMap;
import java.util.Map;
import java.util.function.*;

/**
 * 函数式接口：
 * Lambda表达式，直接写出接口的实现。然后就可以调用了。
 */
public class JdkFunction {
    public static void main(String[] args) {

        Function<Integer, Integer> function = a -> a * a;
        Integer apply = function.apply(9);
        Integer integer = function.andThen(a -> a + 1).apply(9);
        System.out.println(apply);
        System.out.println("--------------------------------");
        System.out.println(integer);


        //输入输出是一样的可以使用
        UnaryOperator<Integer> unaryOperator = a -> a * a;
        Integer apply1 = unaryOperator.apply(9);
        System.out.println(apply1);


        /*
          Supplier的用法
         */
        Supplier<Double> randomSupplier1 = () -> Math.random();
        Supplier<Double> randomSupplier2 = Math::random;
        // 输出: 随机数
        System.out.println(randomSupplier1.get());
        System.out.println(randomSupplier2.get());
        // 提供新对象
        Supplier<String> personSupplier = () -> String.valueOf(666);
        String value = personSupplier.get();
        System.out.println(value);

        /*
        Predicate
         */
        // 检查数字是否为正数
        Predicate<Integer> isPositive = n -> n > 0;
        System.out.println(isPositive.test(5));  // 输出: true
        System.out.println(isPositive.test(-3)); // 输出: false
        // 字符串长度检查
        Predicate<String> isLongEnough = s1 -> s1.length() > 5;
        // 组合使用
        Predicate<String> isLongAndStartsWithA = isLongEnough.and(s2 -> s2.startsWith("A"));
        System.out.println(isLongAndStartsWithA.test("ABCDEF"));
        System.out.println(isLongEnough.test("66666666666666666666666"));

        /*
        Consumer
        定义：接收一个参数 T，无返回值的函数接口
        抽象方法：void accept(T t)
        用途：表示一个消费数据的操作，只处理数据不返回结果
         */
        // 消费字符串
        Consumer<String> printer = System.out::println;
        printer.accept("Hello Consumer"); // 输出: Hello Consumer

        // 消费并处理对象
        Consumer<Map<String, String>> ageIncrementer = p -> p.put("a", "666");
        Map<String, String> map = new HashMap<>();
        ageIncrementer.accept(map);
        String a = map.get("a");
        System.out.println(a);




        // 定义一个IntConsumer，用于打印整数
        IntConsumer printConsumer = (num) -> System.out.println("数字: " + num);
        // 调用accept方法消费int值
        printConsumer.accept(100);  // 输出: 数字: 100
        printConsumer.accept(200);  // 输出: 数字: 200

        
    }
}
